package com.redis.springtest;

import com.redis.springtest.config.RedisConfig;
import com.redis.springtest.entities.Role;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;

import java.util.ArrayList;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 *
 * @author Administrator
 * @create 2020-07-28 11:51
 */
public class AppRedisScript {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(RedisConfig.class);
        final RedisTemplate redisTemplate = ctx.getBean(RedisTemplate.class);

        // 定义默认脚本封装类
        DefaultRedisScript<Role> redisScript = new DefaultRedisScript<>();
        // 设置脚本
        redisScript.setScriptText("redis.call('set',KEYS[1], ARGV[1]) return redis.call('get',KEYS[1])");
        // 定义操作的key列表
        List<String> keyList = new ArrayList<>();
        keyList.add("role1");

        // 需要序列化保存和读取的对象
        Role role = new Role();
        role.setId(1L);
        role.setRoleName("role_name_1");
        role.setNote("note_1");

        // 获取标识字符串
        String sha1 = redisScript.getSha1();
        System.out.println(sha1);

        // 设置返回结果类型，如果没有这句话，结果返回为空
        redisScript.setResultType(Role.class);
        // 定义序列化器
        JdkSerializationRedisSerializer serializer = new JdkSerializationRedisSerializer();
        // 执行脚本
        // 第一个是RedisScript接口对象，第二个是参数序列化器
        // 第三个是结果序列化器, 第四个是Redis的key列表，最后是参数列表
        Object execute = redisTemplate.execute(redisScript, serializer, serializer, keyList, role);
        System.out.println(execute);
    }
}
